package models;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import net.sf.oval.constraint.MaxLength;
import play.db.jpa.Model;

@Entity
public class Processo extends Model {

	@ManyToOne(optional = false)
	private Cartorio cartorio;
	
	@ManyToOne(optional = false)
	private Equipe equipe;
	
	@ManyToOne
	private Parte peritoJuiz;
	
	@ManyToOne(optional = false)
	private TipoAcao tipoAcao;

	@OneToMany
	@JoinColumn(name = "processo_id")
	private Set<ObjetoAcao> objetosAcao = new HashSet<ObjetoAcao>();
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "processo_id")
	private Set<Recurso> recursos = new HashSet<Recurso>();
	
	@OneToMany (cascade = CascadeType.ALL)
	@JoinColumn(name = "processo_id")
	private Set<Andamento> andamentos = new HashSet<Andamento>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<ProcessoResponsavel> responsaveis =  new HashSet<ProcessoResponsavel>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<ProcessoParte> clientesPartesAdversa =  new HashSet<ProcessoParte>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<ProcessoValor> valores = new HashSet<ProcessoValor>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<ProcessoInformacaoAdicional> informacoesAdicionais = new HashSet<ProcessoInformacaoAdicional>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<ProcessoCampoConteudo> camposConteudos = new HashSet<ProcessoCampoConteudo>();
	
	@OneToMany (mappedBy = "pk.parent")
	private Set<HistoricoProcessoFase> historicoProcessoFases = new HashSet<HistoricoProcessoFase>();

	@ManyToMany
	@JoinTable(name = "Processo_Dependencia", joinColumns = @JoinColumn(name = "parent_id"))
	private Set<Processo> dependentes = new HashSet<Processo>();
	
	@ManyToMany
	@JoinTable(name = "Processo_Dependencia", joinColumns = @JoinColumn(name = "child_id"))
	private Set<Processo> dependidos = new HashSet<Processo>();

	@ManyToMany
	@JoinTable(name = "Processo_ResponsavelParteAdversa", joinColumns = @JoinColumn(name = "processo_id"), inverseJoinColumns = @JoinColumn(name = "pessoa_id") )
	private Set<PessoaFisica> responsaveisParteAdversa =  new HashSet<PessoaFisica>();

	@MaxLength(20)
	private String numeroProcesso;
	private String resumo;
	private String arquivoInterno;
	private String ganho;

	private Date dataDistribuicao;
	private Date dataEncerramento;
	private Date dataCriacao;

	private String valorEstimado;
	private String valorAjuizado;
	private String estrategia;

	public Cartorio getCartorio() {
		return cartorio;
	}

	public Parte getPeritoJuiz() {
		return peritoJuiz;
	}

	public void setPeritoJuiz(Parte peritoJuiz) {
		this.peritoJuiz = peritoJuiz;
	}

	public void setCartorio(Cartorio cartorio) {
		this.cartorio = cartorio;
	}

	public Equipe getEquipe() {
		return equipe;
	}

	public void setEquipe(Equipe equipe) {
		this.equipe = equipe;
	}

	public Set<Andamento> getAndamentos() {
		return andamentos;
	}

	public void addAndamento(Andamento andamento) {
		if (andamento != null) {
			andamento.setProcesso(this);
			this.andamentos.add(andamento);
		}
	}

	public Set<ProcessoParte> getClientesPartesAdversa() {
		return clientesPartesAdversa;
	}

	public void addProcessoParte(ProcessoParte processoParte) {
		if (processoParte != null) {
			this.clientesPartesAdversa.add(processoParte);
		}
	}

	public Set<ProcessoCampoConteudo> getCamposConteudos() {
		return camposConteudos;
	}

	public void addCampoConteudo(ProcessoCampoConteudo campoConteudo) {
		if (campoConteudo != null) {
			this.camposConteudos.add(campoConteudo);
		}
	}

	public String getNumeroProcesso() {
		return numeroProcesso;
	}

	public void setNumeroProcesso(String numeroProcesso) {
		this.numeroProcesso = numeroProcesso;
	}

	public Date getDataDistribuicao() {
		return dataDistribuicao;
	}

	public void setDataDistribuicao(Date dataDistribuicao) {
		this.dataDistribuicao = dataDistribuicao;
	}

	public String getResumo() {
		return resumo;
	}

	public void setResumo(String resumo) {
		this.resumo = resumo;
	}

	public String getArquivoInterno() {
		return arquivoInterno;
	}

	public void setArquivoInterno(String arquivoInterno) {
		this.arquivoInterno = arquivoInterno;
	}

	public String getGanho() {
		return ganho;
	}

	public void setGanho(String ganho) {
		this.ganho = ganho;
	}

	public Date getDataEncerramento() {
		return dataEncerramento;
	}

	public void setDataEncerramento(Date dataEncerramento) {
		this.dataEncerramento = dataEncerramento;
	}

	public Set<Processo> getDependentes() {
		return dependentes;
	}

	public void addDependente(Processo dependente) {
		if (dependente != null) {
			this.dependentes.add(dependente);
		}
	}

	public Set<Processo> getDependidos() {
		return dependidos;
	}

	public void addDependido(Processo dependido) {
		if (dependido != null) {
			this.dependidos.add(dependido);
		}
	}

	public Set<ObjetoAcao> getObjetosAcao() {
		return objetosAcao;
	}

	public void addObjetosAcao(ObjetoAcao objetoAcao) {
		if (objetoAcao != null) {
			this.objetosAcao.add(objetoAcao);
		}
	}

	public Set<Recurso> getRecursos() {
		return recursos;
	}

	public void addRecurso(Recurso recurso) {
		if (recurso != null) {
			recurso.setProcesso(this);
			this.recursos.add(recurso);
		}
	}

	public void setValorEstimado(String valorEstimado) {
		this.valorEstimado = valorEstimado;
	}

	public String getValorEstimado() {
		return valorEstimado;
	}

	public void setValorAjuizado(String valorAjuizado) {
		this.valorAjuizado = valorAjuizado;
	}

	public String getValorAjuizado() {
		return valorAjuizado;
	}

	public void addHistoricoProcessoFase(HistoricoProcessoFase historicoProcessoFase) {
		if (historicoProcessoFase != null) {
			this.historicoProcessoFases.add(historicoProcessoFase);
		}
	}

	public Set<HistoricoProcessoFase> getHistoricoProcessoFases() {
		return historicoProcessoFases;
	}

	public void setEstrategia(String estrategia) {
		this.estrategia = estrategia;
	}

	public String getEstrategia() {
		return estrategia;
	}

	public void addValor(ProcessoValor valor) {
		if (valor != null) {
			this.valores.add(valor);
		}
	}

	public Set<ProcessoValor> getValores() {
		return valores;
	}

	public void addInformacaoAdicional(ProcessoInformacaoAdicional informacaoAdicional) {
		if (informacaoAdicional != null) {
			this.informacoesAdicionais.add(informacaoAdicional);
		}
	}

	public Set<ProcessoInformacaoAdicional> getInformacoesAdicionais() {
		return informacoesAdicionais;
	}

	public void setTipoAcao(TipoAcao tipoAcao) {
		this.tipoAcao = tipoAcao;
	}

	public TipoAcao getTipoAcao() {
		return tipoAcao;
	}

	public void addResponsavel(ProcessoResponsavel responsavel) {
		if (responsavel != null) {
			this.responsaveis.add(responsavel);
		}
	}

	public Set<ProcessoResponsavel> getResponsaveis() {
		return responsaveis;
	}

	public void addResponsavelParteAdversa(PessoaFisica responsavelParteAdversa) {
		if (responsavelParteAdversa != null) {
			this.responsaveisParteAdversa.add(responsavelParteAdversa);
		}
	}

	public Set<PessoaFisica> getResponsaveisParteAdversa() {
		return responsaveisParteAdversa;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}

	public Date getDataCriacao() {
		return dataCriacao;
	}
}
